<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
</head>

<body>
    <script>
        /**
         * Find power-set of a set using BITWISE approach.
         *
         * @param {*[]} originalSet
         * @return {*[][]}
         */
        function bwPowerSet(originalSet) {
            const subSets = []

            // We will have 2^n possible combinations (where n is a length of original set).
            // It is because for every element of original set we will decide whether to include
            // it or not (2 options for each set element).
            const numberOfCombinations = 2 ** originalSet.length

            // Each number in binary representation in a range from 0 to 2^n does exactly what we need:
            // it shows by its bits (0 or 1) whether to include related element from the set or not.
            // For example, for the set {1, 2, 3} the binary number of 0b010 would mean that we need to
            // include only "2" to the current set.
            for (let combinationIndex = 0; combinationIndex < numberOfCombinations; combinationIndex += 1) {
                const subSet = []

                for (let setElementIndex = 0; setElementIndex < originalSet.length; setElementIndex += 1) {
                    // Decide whether we need to include current element into the subset or not.
                    if (combinationIndex & (1 << setElementIndex)) {
                        subSet.push(originalSet[setElementIndex])
                    }
                }

                // Add current subset to the list of all subsets.
                subSets.push(subSet)
            }

            return subSets
        }
    </script>
    <script>
        // 调用幂集算法，计算该集合的所有子集
        const res = bwPowerSet(['蓝色', '中国', '20cm'])
        // 所有子集
        console.log(res) //  [ [], [ "蓝色" ], [ "中国" ], [ "蓝色", "中国" ], [ "20cm" ], [ "蓝色", "20cm" ], [ "中国", "20cm" ], [ "蓝色", "中国", "20cm" ] ]


        const res2 = bwPowerSet(['蓝色', '中国', '20cm'])
        // 💥把所有所有子集转字符串，方便程序比较
        res2.forEach(item => {
            // 转换成字符串，方便后期用于字典查找(字符串比较更方便)
            const key = item.join('★')
            console.log(111, key)
        })
    </script>
</body>

</html>
